Program Listing for File initial_bias_factor.h

Return to documentation for file (codes/slam/factor/initial_bias_factor.h)

/*******************************************************
 * Copyright (C) 2019, Robotics Group, Nanyang Technology University
 *
 * This file is part of sslam.
 *
 * Licensed under the GNU General Public License v3.0;
 * you may not use this file except in compliance with the License.
 *
 * Author: Zhang Handuo (hzhang032@e.ntu.edu.sg)
 *******************************************************/

#pragma once

#include <ros/assert.h>
#include <ceres/ceres.h>
#include <Eigen/Dense>
#include "../utility/utility.h"
#include "../utility/tic_toc.h"
#include "../estimator/parameters.h"

namespace noiseFactor {
    class InitialBiasFactor : public ceres::SizedCostFunction<6, 9> {
#ifndef DOXYGEN_SHOULD_SKIP_THIS

        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
    public:
        InitialBiasFactor(const Eigen::Vector3d &_Ba, const Eigen::Vector3d &_Bg) {
            init_Ba = _Ba;
            init_Bg = _Bg;
            sqrt_info = 1.0 / (0.001) * Eigen::Matrix<double, 6, 6>::Identity();
        }

        virtual bool Evaluate(double const *const *parameters, double *residuals, double **jacobians) const {
            Eigen::Vector3d Ba(parameters[0][3], parameters[0][4], parameters[0][5]);
            Eigen::Vector3d Bg(parameters[0][6], parameters[0][7], parameters[0][8]);

            Eigen::Map<Eigen::Matrix<double, 6, 1>> residual(residuals);
            residual.block<3, 1>(0, 0) = Ba - init_Ba;
            residual.block<3, 1>(3, 0) = Bg - init_Bg;
            residual = sqrt_info * residual;

            if (jacobians) {
                if (jacobians[0]) {
                    Eigen::Map<Eigen::Matrix<double, 6, 9, Eigen::RowMajor>> jacobian_bias(jacobians[0]);
                    jacobian_bias.setZero();
                    jacobian_bias.block<3, 3>(0, 3) = Eigen::Matrix3d::Identity();
                    jacobian_bias.block<3, 3>(3, 6) = Eigen::Matrix3d::Identity();
                    jacobian_bias = sqrt_info * jacobian_bias;
                }
            }
            return true;
        }

        Eigen::Vector3d init_Ba, init_Bg;
        Eigen::Matrix<double, 6, 6> sqrt_info;
    };
}